package com.mycode.iterator17;

import com.mycode.iterator17.resolve.AbstractIterator;
import com.mycode.iterator17.resolve.AbstractObjectList;
import com.mycode.iterator17.resolve.ProductList;

import java.util.ArrayList;
import java.util.List;

/**
 * 迭代器模式：提供一种方法来访问聚合对象，而不用暴露这个对象的内部表示，其别名为游标
 * 主要优点：
 *     1、支持以不同的方法遍历一个聚合对象，在同一个聚合对象上可以定义多种遍历方式。
 *     2、迭代器简化了聚合类
 *     3、在迭代器模式中，由于引入了抽象层，增加新的聚合类和迭代器类都很方便，无须修改原有代码
 *
 * 主要缺点：
 *     1、迭代器模式将存储数据和遍历数据的职责分离，增加新的聚合类需要对应增加新的迭代器类，类的个数增加，增加了系统的复杂性
 *     2、抽象迭代器的设计难度较大，需要充分考虑到系统将来的扩展
 *
 * 适用场景：
 *     1、访问一个聚合对象的内容而无须暴露它的内部表示
 *     2、需要为一个聚合对象提供多种遍历方式
 *     3、遍历不同的聚合结构提供一个统一的接口，在该接口的实现类中为不同的聚合结构提供不同的遍历方式，而客户端可以一致性地操作该接口
 */
public class Bootstrap {

    public static void main(String[] args) {
        List products = new ArrayList();
        products.add("111");
        products.add("222");
        products.add("333");
        products.add("444");
        products.add("555");

        // 创建聚合对象
        AbstractObjectList list = new ProductList(products);
        // 创建迭代器对象
        AbstractIterator iterator = list.createIterator();

        System.out.println("正向遍历：");
        while (!iterator.isLast()) {
            System.out.print(iterator.getNextItem() + ",");
            iterator.next();
        }
        System.out.println();
        System.out.println("---------------------------");
        System.out.println("逆向遍历：");
        while (!iterator.isFirst()) {
            System.out.print(iterator.getPreviousItem() + ",");
            iterator.previous();
        }
    }
}
